package c05面向对象;

import java.lang.ref.*;

/**
 * 在JDK 1.2之后，Java对引用的概念进行了扩充，将引用分为强引用（Strong Reference）、
 * 软引用（Soft Reference）、弱引用（Weak Reference）、虚引用（Phantom Reference）4种，
 * 这4种引用强度依次逐渐减弱。
 * <p>
 * 强引用就是指在程序代码之中普遍存在的，类似“Object obj = new Object()”这类的引用，
 * 只要强引用还存在，垃圾收集器永远不会回收掉被引用的对象。
 * <p>
 * 软引用是用来描述一些还有用但并非必需的对象。对于软引用关联着的对象，在系统将要发生内存溢出异常
 * 之前，将会把这些对象列进回收范围之中进行第二次回收。如果这次回收还没有足够的内存，
 * 才会抛出内存溢出异常。
 * <p>
 * 弱引用也是用来描述非必需对象的，但是它的强度比软引用更弱一些，被弱引用关联的对象只能生存到下
 * 一次垃圾收集发生之前。当垃圾收集器工作时，无论当前内存是否足够，都会回收掉只被弱引用关联的对象。
 * <p>
 * 虚引用也称为幽灵引用或者幻影引用，它是最弱的一种引用关系。一个对象是否有虚引用的存在，
 * 完全不会对其生存时间构成影响，也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的
 * 唯一目的就是能在这个对象被收集器回收时收到一个系统通知。
 *
 * @author 炜sama
 */
public class 引用类型之软引用的探究 {
	public static void main(String[] args)
			throws Exception {
		//创建一个字符串对象
		String str = new String("疯狂Java讲义");
		//创建一个软引用，引用到"疯狂Java讲义"字符串
		SoftReference<String> wr = new SoftReference<String>(str);  //①
		//切断str引用和"疯狂Java讲义"字符串之间的引用
		str = null;   //②
		//取出弱引用所引用的对象
		System.err.println(wr.get());  //③
		//通知垃圾回收
		System.gc();
		System.runFinalization();
		//再次取出弱引用所引用的对象
		System.err.println(wr.get());  //④通常不是null！因为软引用比弱引用略强，通常只有在内存不足时才会回收对象
	}
}
